//package cn.yl.gateway.config;
//
//
//import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
//import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
//import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
//import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
//import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
//import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
//import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
//import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
//import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
//import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
//import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
//import org.springframework.beans.factory.ObjectProvider;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.Ordered;
//import org.springframework.core.annotation.Order;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.http.codec.ServerCodecConfigurer;
//import org.springframework.web.reactive.function.BodyInserters;
//import org.springframework.web.reactive.function.server.ServerResponse;
//import org.springframework.web.reactive.result.view.ViewResolver;
//import org.springframework.web.server.ServerWebExchange;
//import reactor.core.publisher.Mono;
//
//import javax.annotation.PostConstruct;
//import java.util.*;
//
//@Configuration
//public class GatewayConfig {
//
//    private final List<ViewResolver> viewResolvers;
//    private final ServerCodecConfigurer serverCodecConfigurer;
//
//
//    public GatewayConfig(ObjectProvider<List<ViewResolver>> viewResolversProvider,
//                         ServerCodecConfigurer serverCodecConfigurer) {
//        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
//        this.serverCodecConfigurer = serverCodecConfigurer;
//    }
//
//    //配置限流的异常处理
//    @Bean
//    @Order(Ordered.HIGHEST_PRECEDENCE)
//    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
//        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
//    }
//
//    // nacos限流
////配置初始化的限流参数
//    @PostConstruct
//    public void initGatewayRules() {
//        Set<GatewayFlowRule> rules = new HashSet<>();
////        resource:路由中的id，setCount(1):阈值，setIntervalSec(1）: 时间 单位 秒
//        rules.add(new GatewayFlowRule("provider-api").setCount(1).setIntervalSec(1));
//        rules.add(new GatewayFlowRule("provider-api1").setCount(1).setIntervalSec(1));
//        rules.add(new GatewayFlowRule("provider-api2").setCount(1).setIntervalSec(1));
//        GatewayRuleManager.loadRules(rules);
//    }
//
//    //自定义API分组
//    @PostConstruct
//    private void initCustomizedApis() {
//        Set<ApiDefinition> definitions = new HashSet<>();
////
//        ApiDefinition api = new ApiDefinition("comment")
//                .setPredicateItems(new HashSet<ApiPredicateItem>() {{
//                    //  /服务/请求窄化/
//                    add(new ApiPathPredicateItem().setPattern("/comment/course/comment/saveCourseComment"));
//                }});
//        ApiDefinition api1 = new ApiDefinition("provider-api1")
//                .setPredicateItems(new HashSet<ApiPredicateItem>() {{
//                    //  /服务/请求窄化/
//                    add(new ApiPathPredicateItem().setPattern("/provider-gateway/provider/api1/**")
//                            .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
//                }});
//        ApiDefinition api2 = new ApiDefinition("provider-api2")
//                .setPredicateItems(new HashSet<ApiPredicateItem>() {{
//                    //  /服务/请求窄化/
//                    add(new ApiPathPredicateItem().setPattern("/provider-gateway/provider/api2/demo1"));
//                    add(new ApiPathPredicateItem().setPattern("/provider-gateway/provider/api2/demo2"));
//                }});
//        definitions.add(api);
//        definitions.add(api1);
//        definitions.add(api2);
//        GatewayApiDefinitionManager.loadApiDefinitions(definitions);
//    }
//
//    //自定义限流异常页面
//    //初始化限流过滤器
//    @Bean
//    @Order(Ordered.HIGHEST_PRECEDENCE)
//    public GlobalFilter sentinelGatewayFilter() {
//        return new SentinelGatewayFilter();
//    }
//
//    @PostConstruct
//    public void initBlockHandlers() {
//        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
//            @Override
//            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
//                Map<String, Object> map = new HashMap();
//                map.put("code", 0);
//                map.put("msg", "被限流了");
//                return ServerResponse.status(HttpStatus.OK)
//                        .contentType(MediaType.APPLICATION_JSON)
//                        .body(BodyInserters.fromValue(map));
//            }
//        };
//        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
//    }
//}